<?php
//这里是基础函数
/**
 * @param $filename 要加载的文件名
 * @param $type 为真就返回文件地址，默认直接加载
 * @return false|string
 */
function func($filename, $type = false)
{
    $filenames=explode("-",$filename);
    $dir=FDir;
    if(count($filenames)>1){
        $filename=$filenames[1];
        switch ($filenames[0]){
            case "m":$dir=MDir;break;
            case "c":$dir=CDir;break;
            case "f":$dir=FDir;break;
            case "v":$dir=VDir;break;
            case "tc":$dir=CDir.(M_C["dir"]?DIRECTORY_SEPARATOR.M_C["dir"]:"");break;
            case "tv":$dir=VDir.(M_C["dir"]?DIRECTORY_SEPARATOR.M_C["dir"]:"");break;
            case "tm":$dir=MDir.(M_C["dir"]?DIRECTORY_SEPARATOR.M_C["dir"]:"");break;
            case "tf":$dir=FDir.(M_C["dir"]?DIRECTORY_SEPARATOR.M_C["dir"]:"");break;
        }
    }else{
        $filename=$filenames[0];
    }
    $fileUri =$dir.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $filename). '.php'; //将命名空间转换为文件路径格式
    if ($type) {
        return $fileUri;
    } else {
        include_once $fileUri;
    }
    return  false;
}
function is_ajax(){
    if(isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower($_SERVER["HTTP_X_REQUESTED_WITH"])=="xmlhttprequest"){
        return true;
    }else{
        return false;
    };
}
function is_post(){
    //判断form数据是否为POST而来，判断数据提交方式
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        return true;
    } else {
        return false;
    }
}
function is_weixin(){
    if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false )
    {
        return true;
    }
    return false;

}
//判断是否是网址
function is_url($v){
    $pattern="#(http|https)://(.*\.)?.*\..*#i";
    if(preg_match($pattern,$v)){
        return true;
    }else{
        return false;
    }
}
//判断是否手机
function is_mobile() {
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
        Return true;
    }
    if (!isset($_SERVER['HTTP_USER_AGENT'])) {
        Return false;
    }
    $waparray = array('android','iphone','ipad','mobile');
    foreach ($waparray as $thisphone) {
        if (stripos($_SERVER['HTTP_USER_AGENT'],$thisphone) === false) {} else {
            Return true;
        }
    }
    Return false;
}
/***
 * 判断是否有缓存插件
 * @return string
 */
function is_cachephpcode() {
    $array=@get_loaded_extensions();
    if($array==false) {$array=array();}
    $cached=false;
    foreach($array as $key=>$val) {
        $val=strtolower($val);
        if(stripos($val,'opcache')===false && stripos($val,'xcache')===false) {
        }else {
            Return ' (如果一直出现安装界面,请清空Opcache等组件的缓存)';
        }
    }
    Return false;
}

//获得ip
function M_ip() {
    if (isset($_SERVER)) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($arr as $ip) {
                $ip = trim($ip);
                if ($ip != 'unknown') {
                    $realip = $ip;
                    break;
                }
            }
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $realip = $_SERVER['HTTP_CLIENT_IP'];
        } else {
            if (isset($_SERVER['REMOTE_ADDR'])) {
                $realip = $_SERVER['REMOTE_ADDR'];
            } else {
                $realip = '0.0.0.0';
            }
        }
    } else {
        if (getenv('HTTP_X_FORWARDED_FOR')) {
            $realip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_CLIENT_IP')) {
            $realip = getenv('HTTP_CLIENT_IP');
        } else {
            $realip = getenv('REMOTE_ADDR');
        }
    }
    preg_match("/[\d\.]{7,15}/",$realip,$onlineip);
    $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
    return $realip;
}
//生成订单号
function M_order() {
    $order_id_main = date('YmdHis') . rand(10000000,99999999);

    $order_id_len = strlen($order_id_main);

    $order_id_sum = 0;

    for ($i = 0; $i < $order_id_len; $i++) {

        $order_id_sum += (int)(substr($order_id_main,$i,1));

    }
    return  $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);
}
//获取顶级域名
function M_topHost($url,$type = 0) {
    if (!$url) {
        return FALSE;
    }
    $url = strtolower($url);
    //首先转成小写
    $hosts = parse_url($url);
    if ($type == 0) {
        $host = $hosts['path'];
    } else {
        $host = $hosts['host'];
    }
    //查看是几级域名
    $data = explode('.', $host);
    $n = count($data);
    //判断是否是双后缀
    $preg = '/[\w].+\.(com|net|org|gov|edu)\.cn$/';
    if (($n > 2) && preg_match($preg, $host)) {
        //双后缀取后3位
        $host = @$data[$n - 3] . '.' . @$data[$n - 2] . '.' . @$data[$n - 1];
    } else {
        //非双后缀取后两位
        $host = @$data[$n - 2] . '.' . @$data[$n - 1];
    }
    return $host;
}

/***自定义函数***/
//随机生成数
function M_rand($length = 6,$type = 1) {

    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $password = '';
    for ($i = 0; $i < $length; $i++) {
        $password .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $password;
}
// run log
function M_runLog() {
    if (!Debug) {
        return false;
    }
    $cost = M_cost();
    echo '<script>console.log("MTFY Log : 控制器 : '.M_C["class"].
        ', 方法 : '.M_C["fun"].' - 运行时间 : '. $cost[0] .'毫秒, 占用内存 : ' . $cost[1] .'k");</script>';
}
/**
 * 时间、内存开销计算
 * @return array(耗时[毫秒], 消耗内存[K])
 */
function M_cost() {
    return array(
        round((microtime(true) - M_START_TIME) * 1000, 2),
        round((memory_get_usage() - M_START_MEMORY) / 1024, 2)
    );
}

function Mrun($router=null,$def=""){
    if(is_string($router)){
        $def=$router;
        $router=null;
    }
    if ($router == null) {
        $router = getRouter(null,$def);
    }else{
        !is_array($router)?showMsg([code=>1,"msg"=>"router参数设置错误"]):null;
    }
    if (count($router) < 2) {
        die("路由错误");
    }
    $M_C=["dir"=>"","class"=>"","fun"=>"","router"=>""];
    //判断是否是文件或者文件夹
    $appClassFile = CDir . DIRECTORY_SEPARATOR . $router[0] . 'Con.php';
    if (!is_readable($appClassFile)) {
        //如果不是文件就判断是否是文件夹
        $appClassDir=CDir . DIRECTORY_SEPARATOR . $router[0];
        if(!is_dir($appClassDir)){
            showMsg("路由错误", 1);
        }
        $appClassFile=CDir . DIRECTORY_SEPARATOR . $router[0] .DIRECTORY_SEPARATOR.$router[1]."Con.php";
        if (!is_readable($appClassFile)) {
            showMsg("路由错误", 1);
        }
        $M_C["dir"]=$router[0];
        array_splice($router,0,1);
    }
    if(!isset($router[1])){
        $router[1]="index";
    }
    $M_C["class"]=$router[0];
    $M_C["fun"]=$router[1];
    $M_C["router"]=($M_C["dir"]?$M_C["dir"]."/":"").$M_C["class"]."/".$M_C["fun"];
    define("M_C",$M_C);
    require($appClassFile);
    $appClassName =($M_C["dir"]?$M_C["dir"]."\\":"").$router[0] . 'Con';
    if (!class_exists($appClassName)) {
        showMsg("未发现此接口", 1);
    }
    //加载公共前置
    $classInitFile=CDir . DIRECTORY_SEPARATOR . ($M_C["dir"]?$M_C["dir"].DIRECTORY_SEPARATOR:"")."_init.php";;
    if (is_readable($classInitFile)) {
        require_once $classInitFile;
    }
    //初始化类
    $APP = new $appClassName();
    //赋值处理的文件
    if (is_callable([$APP, $router[1]])) {
        array_shift($router);
        array_shift($router);
        $GLOBALS['gets'] = $router;
        unset($res);
        //调用独立类前置
        if (is_callable([$APP, '__init'])) {
            call_user_func([$APP, '__init']);
        }
        call_user_func([$APP, M_C["fun"]]);
    } else {
        if (is_callable([$APP, '__error'])) {
            @call_user_func([$APP, '__error']);
        } else {
            showMsg("未发现此功能", 1);
        }
        exit;
    }
    M_runLog();
}

/**
 * 路由跳转
 * @param $url 跳转的网址
 * @param $type 类型 false默认返回新的链接地址，true直接跳转
 * @param $urltype 获取当前的链接类型，伪静态或者无伪静态，默认获取当前状态
 * @return void
 */
function R($url,$type=false,$urltype=null){
    if(!$urltype){
        $urltype=UrlType;
    }
    if ($urltype==1){
        //这里是未静态，不用任何操作
    }elseif ($urltype==2){
        //这里是pash_info php8.0以后
        $url=getUrlP().$url;
    }else{
        //这里是参数
        $pase=parse_url($url);
        $query=[];
        if(isset($pase["query"])){
            parse_str(@$pase["query"],$query);
        }
        $query[(is_string($urltype)?$urltype:"do")]=$pase["path"];
        $url=getUrlP()."?".http_build_query($query);
    }
    if($type){
        header("location:".$url);
        exit;
    }else{
        return $url;
    }
}
/**
 * 获取输入参数 支持过滤和默认值
 * 使用方法:
 * <code>
 * I('id',0); 获取id参数 自动判断get或者post
 * I('post.name','','htmlspecialchars'); 获取$_POST['name']
 * I('get.'); 获取$_GET
 * </code>
 * @param string $name 变量的名称 支持指定类型
 * @param mixed $default 不存在的时候默认值
 * @return mixed
 */
function I($name,$default = NULL) {
    if (strpos($name,'.')) {
        // 指定参数来源
        //判断参数$name中是否包括.号
        list($method,$name) = explode('.',$name,2);
        //如果包括.号将.号前后分隔，并且分别赋值给$method以及$name
    } else {
        // 默认为自动判断
        //如果没有.号
        $method = 'param';
    }
    switch (strtolower($method)) {
        //将$method转换为小写
        //如果$method为get，则$input为$_GET
        case 'get':case "g":  $input =$_GET;
            break;
        //如果$method为get，则$input为$_POST
        case 'post':case "p":  $input = $_POST;
            // }
            break;
        //如果为put，则将post的原始数据转参数给$input
        case 'put': parse_str(file_get_contents('php://input'), $input);
            break;
        //如果为gets,则将网址里的多余参数获取
        case 'gets':$input =& $GLOBALS['gets'];
            break;

        //如果是param
        case 'param'   :
            //判断$_SERVER['REQUEST_METHOD']
            switch ($_SERVER['REQUEST_METHOD']) {
                //如果为post，则$input的内容为$_POST的内容
                case 'POST':
                    $input =$_POST;
                    break;
                //如果为PUT.则input的内容为PUT的内容
                case 'PUT':
                    parse_str(file_get_contents('php://input'), $input);
                    break;
                //默认为$_GET的内容
                default:
                    $input =$_GET;
            }
            break;
        //如果$method为request，则$input为$_REQUEST
        case 'request' :   $input =& $_REQUEST;
            break;
        //如果$method为session，则$input为$_SESSION
        case 'session' :   $input =& $_SESSION;
            break;
        //如果$method为cookie，则$input为$_COOKIE
        case 'cookie'  :   $input =& $_COOKIE;
            break;
        //如果$method为server，则$input为$_SERVER
        case 'server'  :   $input =& $_SERVER;
            break;
        //如果$method为globals，则$input为$GLOBALS
        case 'globals':  $input =& $GLOBALS;
            break;
        //默认返回空
        default:
            return NULL;
    }
    /**
     * 到此为止，已经根据传入的参数的需要（第一个参数.号前面的），把所有的变量都取到了。下面就是返回变量的内容了。
     **/
    //如果$name为空，也就是I()第一个参数的.号后面为空的时候
    if ($name === NULL || $name === '') {
        // 获取全部变量
        //获取到的变量$input全部复制给$data
        $data = $input;
    } elseif (isset($input[$name])) {
        // 取值操作
        $data = $input[$name];
    } else {
        // 变量默认值
        $data = isset($default)?$default:NULL;
    }
    $data=str_replace(array('<','>', '"', "'"),array('&lt;','&gt;', '&quot;',''), $data);
    return $data;
}
function getUrl() {
    if (isset($_SERVER['HTTP_X_ORIGINAL_URL'])) {
        $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_ORIGINAL_URL'];
    } elseif (isset($_SERVER['HTTP_X_REWRITE_URL'])) {
        $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
    } elseif (isset($_SERVER['HTTP_REQUEST_URI'])) {
        $_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI'];
    }
    return $_SERVER['REQUEST_URI'];
}
//获取当前url的地址，排除path_info,php>=8.0
function getUrlP(){
    $urlp=cGet("urlP");
    if(!$urlp){
        $urlp=str_replace($_SERVER["PATH_INFO"],"",$_SERVER["DOCUMENT_URI"]);
        cSet("urlP",$urlp);
    }
    return $urlp;
}
function getUrlQuery($url){
    if(!$url) {
        $url = $GLOBALS['no_arg_uri'];
    }
    parse_str(@parse_url($url)["query"],$b);
    return $b?$b:[];
}
//获取公共目录的文件
function getPublicFile($path){
    return ROOT.DIRECTORY_SEPARATOR."public".DIRECTORY_SEPARATOR.$path;
}
//获取服务器域名
function getServerDomain() {
    if(!isset($_SERVER['S_NAME'])) {
        if(isset($_SERVER['HTTP_HOST'])){
            $thisserver_names=explode(':',$_SERVER['HTTP_HOST']);
            $_SERVER['S_NAME']=strtolower($thisserver_names[0]);
        }else {
            $_SERVER['S_NAME']=strtolower($_SERVER['SERVER_NAME']);
        }
    }
    Return $_SERVER['S_NAME'];
}
//匹配两个域名
function checkDomain($domains,$defdomain=null) {
    if(empty($domains) || !$domains) {Return true;}
    if(!$defdomain){
        $defdomain=getServerDomain();
    }
    if(!is_array($domains)) {
        $domains=explode(';',$domains);
    }
    foreach($domains as $val) {
        $val=strtolower(trim($val));
        if($val==$defdomain) {Return true;}
        if($val=='*') {Return true;}
        $thisstripos=stripos($val,'*');
        if($thisstripos===false) {}else {
            $topdomain=substr($val,$thisstripos+1,strlen($val)-$thisstripos);
            if(substr($defdomain,-strlen($topdomain))==$topdomain) {Return true;}
            if('*.'.$defdomain==$val)Return true;
        }
    }
    Return false;
}
//处理字符串变成数组
function handleStrRouter($router){
    $router=explode('/', $router);
    $newrouter=[];
    if(is_array($router)){
        foreach ($router as $v){
            if($v && preg_match("/^[a-z\d]{1,25}$/i",$v)){
                $newrouter[]=$v;
            }
        }
    }
    return $newrouter;
}
/**
 * 获取当前路由
 * @param $type =路由样式，null 执行网址路由1，2执行path_info路由，字符串执行3参数路由
 * @param $def=默认路由，找不到对应后返回默认，无默认就index/index
 * @return array
 */
function getRouter($type=null,$def=[]){
    if(!$type){
        $type=UrlType;
    }
    if(!$type || $type==1){
        $path = getUrl();
        $noarguri = explode('?', $path);
        $path=$noarguri[0];
    }elseif ($type==2){
        $path=$_SERVER["PATH_INFO"];
    }else{
        !is_string($type)?$type="do":null;
        $path="";
        if(isset($_GET[$type])){
            $path=$_GET[$type];
        }
    }
    $GLOBALS['no_arg_uri'] =$path;
    @header(base64_decode('WC1Qb3dlcmVkLUJ5OmltdGZ5LmNvbQ=='));
    //执行匹配路由
    $router=[];
    //路由模式 1 正则匹配路由，需要配置Router,2 路径/分段路由 ，3共同使用，如果正则没有，则分段继续
    $router2=$def?$def:Config(".routerDef");
    is_string($router2)?$router2=handleStrRouter($router2):null;
    if(Config(".routerType")!=2){
        func("AltoRouter");
        $Ar=new AltoRouter();
        $Ar->addRoutes(Config("router"));
        $zrouter=$Ar->match($path);
        $router=$zrouter?$zrouter["target"]:"";
        foreach ($zrouter["params"]??[] as $k=>$v){
            $_GET[$k]=$v;
        }
        if($router){
            $router=explode('/', $router);
            goto END;
        }
    }
    if(Config(".routerType")!=1){
        $router=[];
        //判断域名是否正确
        if(checkDomain(Config(".domain"))){
            $router=handleStrRouter($path);
        };
    }
    END:
    return array_replace($router2,$router);
}
/**
 * 设置或配置信息,这个是长久存储，多用户共享
 * 配置1，设置文件地址，只设置一项则返回配置文件信息
 * 配置2，设置保存数组，追加保存
 */
function Config($config_file,$new_config = null) {
    //判断是否有点，有点就返回相应参数
    if (strpos($config_file,'.')!==false) {
        // 指定参数来源
        //判断参数$name中是否包括.号
        list($config_file,$method) = explode('.',$config_file,2);
        //如果包括.号将.号前后分隔，并且分别赋值给$method以及$name
    } else {
        // 默认为全部
        //如果没有.号
        $method = '';
    }
    if(!$config_file){
        $config_file="config";
    }
    $cfile=$config_file;
    $config_file=ConfigDir.DIRECTORY_SEPARATOR.$config_file.".php";
    if ($new_config) {
        if (is_file($config_file) && is_writable($config_file)) {
            $config = require $config_file;
            if(!$config){
                $config=[];
            }
            if($method){
                $config = array_merge($config,[$method=>$new_config]);
            }else{
                $config = array_merge($config, $new_config);
            }
            file_put_contents($config_file, "<?php \nreturn " . stripslashes(var_export($config, true)) . ";", LOCK_EX);
            cSet("C_".$cfile,$config);
            return true;
        } else {
            return false;
        }
    } else {
        $data=cGet("C_".$cfile.".".$method);
        if($data!==null){
            return $data;
        }
        if (is_file($config_file)) {
            cSet("C_".$cfile,@require $config_file);
            return cGet("C_".$cfile.".".$method);
        }
        return false;
    }
}

/***
 * 临时缓存，单用户生效，用完失效
 * @param $name
 * @param $def
 * @return void
 */
function cGet($name=null,$def=null){
    global $user_config;
    if(!$user_config){
        $user_config=CacheGlobal::new();
    }
    return $user_config->get($name,$def);
}
function cSet($name,$data,$merge=null){
    global $user_config;
    if(!$user_config){
        $user_config=CacheGlobal::new();
    }
    return $user_config->set($name,$data,$merge);
}
function getShowName($name){
    $name=trim($name);
    if(!$name || $name=="/"){
        $name=(M_C["dir"]?M_C["dir"].DIRECTORY_SEPARATOR:"").M_C["class"].DIRECTORY_SEPARATOR.M_C["fun"];
    }else{
        //判断前面是否有.一个点是当前文件夹的名字，两个是上级文件夹然后进行
        $pre=mb_substr($name,0,2);
        if($pre[0]=="."){
            if($pre[1]=="."){
                $name=(M_C["dir"]?M_C["dir"].DIRECTORY_SEPARATOR:"").mb_substr($name,2);
            }else{
                $name=(M_C["dir"]?M_C["dir"].DIRECTORY_SEPARATOR:"").M_C["class"].DIRECTORY_SEPARATOR.mb_substr($name,1);
            }
        }
    }
    return $name;
}
/***
 * 展示模板
 * show($data),直接匹配当前目录一致的文件并存放数据
 * shwo("index/aa",$data)匹配相应的模板文件并存放数据
 * @return void
 * @throws Exception
 */
function show(){
    $numargs = func_num_args();
    $args = func_get_args();
    $data=[];
    $name="";

    if($numargs==1){
        switch (gettype($args[0])){
            case "string":$name=$args[0];break;//这里当作模板
            case "array":$data=$args[0];break;
        }
    }
    if($numargs==2){
        is_array($args[0])?$data=$args[0]:(is_string($args[0])?$name=$args[0]:null);
        is_array($args[1])?$data=$args[1]:(is_string($args[1])?$name=$args[1]:null);
    }
    extract($data);
    $name=trim($name);
    if(!$name || $name=="/"){
        $name=(M_C["dir"]?M_C["dir"].DIRECTORY_SEPARATOR:"").M_C["class"].DIRECTORY_SEPARATOR.M_C["fun"];
    }else{
        //判断前面是否有.一个点是当前文件夹的名字，两个是上级文件夹然后进行
        $pre=mb_substr($name,0,2);
        if($pre[0]=="."){
            if($pre[1]=="."){
                $name=(M_C["dir"]?M_C["dir"].DIRECTORY_SEPARATOR:"").mb_substr($name,2);
            }else{
                $name=(M_C["dir"]?M_C["dir"].DIRECTORY_SEPARATOR:"").M_C["class"].DIRECTORY_SEPARATOR.mb_substr($name,1);
            }
        }
    }
    $fileUri = VDir.DIRECTORY_SEPARATOR . $name . '.php';
    if(is_readable($fileUri)){
        require $fileUri;
    }else{
        throw new Exception("模板文件不存在".$name);
    }
}

/***
 * 输出错误，如果试get就输出文字，post输出json
 * @param $txt 输出文字
 * @param $code 输出代码
 * @param $type 输出样式，默认根据get和post
 * @return void
 */
function showMsg($txt,$code=0,$type=""){
    jsonMsg(["code" => $code, "msg" =>$txt]);
}
set_error_handler('__showErr');
set_exception_handler("__showErr2");
function __showErr($errNo,$errMsg,$errFile,$errLine){
    if(Debug){
        show("lib/debug",compact("errNo","errMsg","errFile","errLine"));exit;
    }

}
function __showErr2($e){
    $trace=$e->getTrace()[0];
    print_r($e->getPrevious());
    if(Debug){
        show("lib/debug",["errNo"=>$e->getCode(),"errMsg"=>$e->getMessage(),"errFile"=>$e->getFile(),"errLine"=>$e->getLine(),"fun"=>$trace["function"]]);exit;
    }
}
//json api模式
function jsonMsg($Msg) {
    cSet("Dbug",false);
    header('Content-type:text/json');
    die(json_encode($Msg,JSON_UNESCAPED_UNICODE));
}
function startSession() {
    $dir = CacheDir.DIRECTORY_SEPARATOR."session".DIRECTORY_SEPARATOR;
    if (!is_dir($dir)) {
        mkdir($dir, 0777, true);
    }
    session_save_path($dir);
    session_start();
    session_write_close();
}
function session() {
    $numargs = func_num_args();
    $args = func_get_args();
    if ($numargs == 1) {
        if (isset($_SESSION[$args[0]])) {
            return $_SESSION[$args[0]];
        }
        return null;
    }
    if ($numargs >= 2) {
        @session_start();
        if($args[1]===null){
            unset($_SESSION[$args[0]]);
        }else{
            $_SESSION[$args[0]] = $args[1];
        }
        session_write_close();
    }
}
//cookie设置,全局
function cookie() {
    $numargs = func_num_args();
    $args = func_get_args();
    if ($numargs == 1) {
        if (isset($_COOKIE[$args[0]])) {
            return $_COOKIE[$args[0]];
        }
        return null;
    }
    if ($numargs >= 2) {
        if ($args[1] === null) {
            setcookie($args[0], 'null', time() - 1000, '/');
            return;
        }
        $expire = @$args[2]?$args[2]:31536000;
        $expire += time();
        @setcookie($args[0], $args[1], $expire, '/');
        $_COOKIE[$args[0]] = $args[1];
    }
}
function cache(){
    $numargs = func_num_args();
    $args = func_get_args();
    global $cache;
    if(!$cache){
        $cdata=Config(".cache");
        switch (@$cdata["type"]){
            case "redis":case "Redis": $cache=CacheRedis::newc($cdata); break;
            case "mem":case "Mem": $cache=CacheMem::newc($cdata); break;
            default :$cache=CacheFile::newc($cdata); break;
        }

    }
    switch ($numargs){
        case 0;return false;
        case 1:return $cache->get($args[0]); //获取数据
        case 2:$cache->set($args[0],$args[1]);return true;break;
        case 3:$cache->set($args[0],$args[1],$args[2]);return true;break;
    }
    return false;
}
//创建数据库链接
function mdb($config = NULL)
{
    if (isset($GLOBALS['mdb'])) return $GLOBALS['mdb'];
    return $GLOBALS['mdb'] =mdbN($config?$config:Config("db"));
}
//创建个新的数据库链接
function mdbN($config){
    func('Medoo');
    return new Medoo\Medoo($config);
}
//创建自动加载函数
spl_autoload_register(function ($className) {
    $classNames=explode("\\",$className);
    $dir=FDir;
    $namespaces="";
    $num=count($classNames);
    $class=$classNames[$num-1];
    switch (substr($class,-3,3)){
        case "Con":$dir=CDir;break;
        case "Mod":$dir=MDir;break;
        case "Fun":$dir=FDir;break;
    }
    $file =$dir.DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, $className). '.php'; //将命名空间转换为文件路径格式
    if (is_readable($file)) {
        require_once($file);
    } else {
        throw new Exception("File '$file' does not exist or is not readable.");
    }
});

//检查get参数
function checkGet(){
    return str_replace(array('<','>', '"', "'"),array('&lt;','&gt;', '&quot;',''), $_GET);
}
//检查post参数
function checkPost(){
    return str_replace(array('<','>', '"', "'"),array('&lt;','&gt;', '&quot;', ''), $_POST);
}

//加密解密函数
function lockString($string,$operation,$key = 'mtfy') {
    if ($operation == 'D') {
        $string = str_replace(array('-01.-','-02.-','-03.-','-04.-'),array('%','/','+','='),$string);
    }
    $key = md5($key);
    $key_length = strlen($key);
    $string = $operation == 'D'?base64_decode($string):substr(md5($string.$key),0,8).$string;

    $string_length = strlen($string);
    $rndkey = $box = array();
    $result = '';
    for ($i = 0;$i <= 255;$i++) {
        $rndkey[$i] = ord($key[$i%$key_length]);
        $box[$i] = $i;
    }
    for ($j = $i = 0;$i < 256;$i++) {
        $j = ($j+$box[$i]+$rndkey[$i])%256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    for ($a = $j = $i = 0;$i < $string_length;$i++) {
        $a = ($a+1)%256;
        $j = ($j+$box[$a])%256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result.= chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
    }
    if ($operation == 'D') {
        if (substr($result,0,8) == substr(md5(substr($result,8).$key),0,8)) {
            return substr($result,8);
        } else {
            return'';
        }
    } else {
        return str_replace(array('=','%','/','+'),array('-04.-','-01.-','-02.-','-03.-'),base64_encode($result));
    }
}

function createDir($path){
    if (!file_exists($path)){
        createDir(dirname($path));
        if(!@mkdir($path, 0777)) {
            die(dirname($path).' permission denied');
        }
    }
}
function serverName() {
    if(!isset($_SERVER['UUUSERVER_NAME'])) {
        if(isset($_SERVER['HTTP_HOST'])){
            $thisserver_names=explode(':',$_SERVER['HTTP_HOST']);
            $_SERVER['UUUSERVER_NAME']=$thisserver_names[0];
        }else {
            $_SERVER['UUUSERVER_NAME']=$_SERVER['SERVER_NAME'];
        }
        $_SERVER['UUUSERVER_NAME']=strtolower($_SERVER['UUUSERVER_NAME']);
    }
    Return $_SERVER['UUUSERVER_NAME'];
}